#pragma once
#include "LEX.h"
#include "ExpAST.h"
#include "ValMgr.h"
class parser
{
    LEX* lexer;
    
    unique_ptr<BaseExpAST>parsePrimaryExp();
    unique_ptr<BaseExpAST>parseNumber();
    unique_ptr<BaseExpAST>parsePostfixExp();
    unique_ptr<BaseExpAST>parseVal();
    unique_ptr<BaseExpAST>parseUnaryExp();
    unique_ptr<BaseExpAST>parseMulExp();
    unique_ptr<BaseExpAST>parseAddExp();
    unique_ptr<BaseExpAST>parseShiftExp();
    unique_ptr<BaseExpAST>parseRelExp();
    unique_ptr<BaseExpAST>parseEqExp();
    unique_ptr<BaseExpAST>parseAndExp();
    unique_ptr<BaseExpAST>parseXorExp();
    unique_ptr<BaseExpAST>parseOrExp();
    unique_ptr<BaseExpAST>parseLAndExp();
    unique_ptr<BaseExpAST>parseLOrExp();
    unique_ptr<BaseExpAST>parseTernaryExp();
    unique_ptr<BaseExpAST>parseAssignExp();
    unique_ptr<BaseExpAST>parseCommaExp();
    unique_ptr<BaseExpAST>parseExp();
    
    std::pair<std::string,unique_ptr<BaseExpAST>>parseVarDef(bool constDecl);
    unique_ptr<BaseAST>parseDecl();
public:
    parser();
    parser(LEX* lex);
    unique_ptr<BaseAST>parseStatement();
};

